// 1.创建一个新的axios的实例
// 2.请求拦截器，如果有token进行头部的携带
// 3.响应拦截器：1.剥离无效数据2.处理token时效
// 4.导出一个函数来调用当前的axios实例发请求，返回值promise
import axios from "axios";
import store from "@/store"
import router from "@/router"
// 导出基准地址，原因：其他的房不是通过azios发送请求的地方上 用基准地址
export  const baseURL="https://pcapi-xiaotuxian-front-devtest.itheima.net/"
const instance=axios.create({
  // axios的一些配置，baseURL timeout
  baseURL,
  timeout:5000
})
instance.interceptors.request.use(config=>{
  // 拦截的业务逻辑
  // 进行请求配置的修改
  // 如果本地有token就在头部携带token
  //1.获取用户信息对象
  const {profile}= store.state.user
  // 2.判断是否有token
  if(profile.token){
    // 3.设置token
    config.headers.Authorization=`Bearer ${profile.token}`
  }
  return config
},error=>{
  return Promise.reject(error)
})
// 响应拦截器
// res=>res.data，取出data数据，将来调用接口的时候直接拿到的就是后台的数据
instance.interceptors.response.use(res=>res.data,(err)=>{
  // 处理token时效
  // 1. 401 状态码，进入该函
  if(err.response && err.response.status ===401){
    //1.清空本地无效的用户信息
    store.commit("/user/setUser",{})
    // 2.跳转到登录页
    // 当前路由地址。在组件里面拿==》$route.path
    // `/user?a=10`  $route.path ==='/user'(只能拿到/user，？后面的拿不到)
    // `/user?a=10`  $route.path.fullPath ==='/user？a=10'(可以拿到完整地址)前提是在组件里面获取

    // js模块中： router.currentRoute.value.fullPath 就是当前路由地址，
    // router.currentRoute是ref响应式数据，要想拿其中的属性，通过.value去拿
    const fullPath= encodeURIComponent(router.currentRoute.value.fullPath)
    router.push('/login?redirectUrl=' +fullPath)
    // router.push('/login?redirectUrl=' +'当路由地址')
    // 3.跳转需要传参（当前路由地址）给登录页码

  }
  return Promise.reject(err)
})
// 请求工具函数
export default (url,method,submitData) => {
// 负责发请求：请求地址，请求方式，提交的数据
  return instance({
    url,
    method,
// 1.如果是get请求，需要使用params来传递submitData   ?问号后面传参，？a=10&b=10
// 2.如果不是get请求，需要使用data来传递submitData（data可能是params,可能是data,它取决于method是谁（get,post,delete,put））
// 2.data是请求体传参
// const a={name:100}, a.name  a["name"],a[10>9 ?'name' :'age']中括号里可以写js表达式，也可以写变量
// []的理解：设置一个动态的key,写js表达式 js表达式的执行结会当成key
//method:get,Get,GET ,将其转换为小写来再来判断
    [method.toLowerCase() ==='get'?'params' :'data']:submitData

})
}
